iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

資料蒐集與分散式運算 30 天系列 第 18

[Day 18] Instagram - Hashtag 搜尋

  • 分享至 

  • xImage
  •  

歡迎來到第 18 天,首先祝各位中秋愉快!那今天就伴隨著各種炭火味開始今天主題吧!

繼昨天成功透過 Selenium 模擬登入,今天我們要進入下一個階段也就是透過 IG 的 Hashtag 方式進行圖片搜索以及下載。

觀察

首先我們透過人為的方式進行 Hashtag 的搜尋,並觀察 Network 資料傳遞狀況。在我們送出 #marutaro 的搜尋時,會看到 Network 出現一個對 https://www.instagram.com/explore/tags/marutaro/?__a=1 的請求,而觀察 Response 的內容,是一個 JSON 格式的資料並包含了許多圖片的 URL 位置及時間相關資訊。

https://ithelp.ithome.com.tw/upload/images/20201001/20128931ZxbG1Fc96D.png

https://ithelp.ithome.com.tw/upload/images/20201001/20128931c0Sr1uht1o.png

在觀察的過程意外發現 https://www.instagram.com/explore/tags/marutaro/?__a=1 的請求並沒有登入需求,亦即可透過 requests 的方式直接取得我們所需的資料。

寫扣

首先先處理請求所得到的 JSON 資料,我們可以透過 response.json() 的方式將 JSON 轉成 python 熟悉的 dict 資料格式,在進行分析

import requests
response = requests.get("https://www.instagram.com/explore/tags/marutaro/?__a=1")
data = response.json()

在分析完整個 json 檔後會發現所有的圖片都藏在 graphql/hashtag/edge_hashtag_to_top_posts/edges 這個結構之下,因此只要一個 for 迴圈就可以調出所有的圖片網址

urls = []
for post in data['graphql']['hashtag']['edge_hashtag_to_top_posts']['edges']:
    urls.append(post['node']['display_url'])

接下來就是下載了,但怎麼透過 python 實踐下載呢?下載的拆解其實就是傳送請求到圖片位置,得到圖片 bytes 的資料回傳,在預計儲存的位置新開啟一個檔案,並將為傳值寫入並關閉,這樣就完成下載流程了

for i, url in enumerate(urls):
    with open(f'{預計儲存路徑}/maru_{i}.png','wb') as f:
        f.write(requests.get(url).content)

這樣就下載完所有柴犬 Maru 的所有照片了!但打開資料夾才發現,怎麼只有 9 張?這會牽扯到明天要談論的主題無限捲軸的問題,那今天就先到這裡,明天見!


上一篇
[Day 17] Instagram - 模擬登入
下一篇
[Day 19] Intagram - 無限捲軸爬蟲
系列文
資料蒐集與分散式運算 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言